package com.pclong.sql;


public class SQLiteGenerator implements SQLGenerator{

	/**
	 * 插入的新纪录对应的ID值。
	 */
	private String insertedIdMethod = "SELECT last_insert_rowid()";
	
	/**
	 * 获取所插入的新纪录对应的ID值。
	 */
	public String getInsertedIdMethod() {
		return insertedIdMethod;
	}
	
	// ==================================================================================
	// GENERATE_INSERT_STATEMENT
	// ==================================================================================
	/**
	 * 给定表名tableName和字段数组colNames，将其拼接为一条Insert语句。
	 */
	public String generateInsertStatement(String tableName, String[] colNames) {
		StringBuffer temp = new StringBuffer("");
		StringBuffer paramsTemp = new StringBuffer("");
		temp.append("insert into ");
		temp.append("`");
		temp.append(tableName);
		temp.append("` ");
		temp.append("(");
		for(String colName : colNames) {
			temp.append("`");
			temp.append(colName);
			temp.append("`, ");
			
			paramsTemp.append("?, ");
		}
		temp.delete(temp.length() - 2, temp.length());
		paramsTemp.delete(paramsTemp.length() - 2, paramsTemp.length());
		temp.append(") values (");
		temp.append(paramsTemp);
		temp.append(")");
		
		return temp.toString();
	}

	// ==================================================================================
	// GENERATE_UPDATE_STATEMENT
	// ==================================================================================
	/**
	 * 给定表名tableName和需要更新的字段数组colNames，
	 * 将其拼接为一条带有where查询条件（where参数中需要自带where关键字）的Update语句。
	 */
	public String generateUpdateStatementWhere(String tableName, String[] colNames, String where) {
		StringBuffer temp = new StringBuffer("");
		temp.append("update ");
		temp.append("`");
		temp.append(tableName);
		temp.append("` ");
		temp.append("set ");
		for(String colName : colNames) {
			temp.append("`");
			temp.append(colName);
			temp.append("` = ");
			temp.append("?, ");
		}
		temp.delete(temp.length() - 2, temp.length());
		if(where != null && where.length() > 0) {
			temp.append(" ");
			temp.append(where);
		}
		
		return temp.toString();
	}

	/**
	 * 给定表名tableName和需要更新的字段名colName（只希望更新一个字段），
	 * 将其拼接为一条带有where查询条件（where参数中需要自带where关键字）的Update语句。
	 */
	public String generateUpdateStatementWhere(String tableName, String colName, String where) {
		return generateUpdateStatementWhere(tableName, new String[] {colName}, where);
	}
	
	/**
	 * 给定表名tableName和需要更新的字段数组colNames，
	 * 将其拼接为一条带有ID查询条件的Update语句。
	 */
	public String generateUpdateStatementId(String tableName, String[] colNames) {
		String where = " where `id` = ?";
		return generateUpdateStatementWhere(tableName, colNames, where);
	}

	/**
	 * 给定表名tableName和需要更新的字段名colName（只希望更新一个字段），
	 * 将其拼接为一条带有ID查询条件的Update语句。
	 */
	public String generateUpdateStatementId(String tableName, String colName) {
		String where = " where `id` = ?";
		
		return generateUpdateStatementWhere(tableName, colName, where);
	}

	/**
	 * 给定表名tableName和需要更新的字段数组colNames，将其拼接为一条Update语句。
	 */
	public String generateUpdateStatement(String tableName, String[] colNames) {
		return generateUpdateStatementWhere(tableName, colNames, null);
	}

	/**
	 * 给定表名tableName和需要更新的字段名colName（只希望更新一个字段），
	 * 将其拼接为一条Update语句。
	 */
	public String generateUpdateStatement(String tableName, String colName) {
		return generateUpdateStatementWhere(tableName, colName, null);
	}

	// ==================================================================================
	// GENERATE_DELETE_STATEMENT
	// ==================================================================================
	/**
	 * 给定表名tableName，将其拼接为一条带有where查询条件（where参数中需要自带where关键字）的delete语句。
	 */
	public String generateDeleteStatementWhere(String tableName, String where) {
		StringBuffer temp = new StringBuffer("");
		temp.append("delete from ");
		temp.append("`");
		temp.append(tableName);
		temp.append("`");
		if(where != null && where.length() > 0) {
			temp.append(" ");
			temp.append(where);
		}
		
		return temp.toString();
	}

	/**
	 * 给定表名tableName，将其拼接为一条带有ID查询条件的delete语句。
	 */
	public String generateDeleteStatementId(String tableName) {
		String where = " where `id` = ?";
		
		return generateDeleteStatementWhere(tableName, where);
	}

	/**
	 * 给定表名tableName，将其拼接为一条带有ID查询条件的delete语句
	 * （没有where条件，则删除全表所有记录）。
	 */
	public String generateDeleteStatement(String tableName) {
		return generateDeleteStatementWhere(tableName, null);
	}

	// ==================================================================================
	// GENERATE_SELECT_STATEMENT
	// ==================================================================================
	/**
	 * 给定表名tableName和需要查询的字段数组colNames，
	 * 将其拼接为一条带有where查询条件（where参数中需要自带where关键字）的select语句。
	 */
	public String generateSelectStatementWhere(String tableName, String[] colNames, String where) {
		StringBuffer temp = new StringBuffer("");
		temp.append("select ");
		for(String colName : colNames) {
			temp.append("`");
			temp.append(colName);
			temp.append("`, ");
		}
		temp.delete(temp.length() - 2, temp.length());
		temp.append(" from ");
		temp.append("`");
		temp.append(tableName);
		temp.append("`");
		if(where != null && where.length() > 0) {
			temp.append(" ");
			temp.append(where);
		}
		
		return temp.toString();
	}
	
	/**
	 * 给定表名tableName和需要查询的字段数组colNames，
	 * 将其拼接为一条带有ID查询条件的select语句。
	 */
	public String generateSelectStatementId(String tableName, String[] colNames) {
		String where = " where `id` = ?";
		
		return generateSelectStatementWhere(tableName, colNames, where);
	}
	
	/**
	 * 给定表名tableName和需要查询的字段数组colNames，
	 * 将其拼接为一条select语句。（没有where条件，则查询全表所有记录）。
	 */
	public String generateSelectStatement(String tableName, String[] colNames) {
		return generateSelectStatementWhere(tableName, colNames, null);
	}

	/**
	 * 给定表名和该表的id字段名称，拼成一条含有where条件的查询结果数量语句。
	 */
	public String generateCountStatementId(String tableName, String idField,
			String where) {
		String sql = "select count(`" + idField + "`) from `" + tableName + "` ";
		sql += where;
		
		return sql;
	}

	
	
	
}
